import {
  BaseSearchProp,
  BaseSearchResult,
  ClusterHealth,
  DataSearchProp,
  DataSearchResult,
  IndexItem,
  IndexItemResult,
  Overview,
  SeniorSearchProp
} from "./types";

export interface ElasticsearchClient {
  // ---------------------------------------- 实例操作 ----------------------------------------

  /**
   * 获取状态信息，用于展示
   * @param url 链接
   */
  getState: (url: string) => Promise<string>;

  /**
   * 集群健康状态
   */
  clusterHealth: () => Promise<ClusterHealth>;

  /**
   * 获取节点基础信息
   */
  info: () => Promise<Overview>;

  // ---------------------------------------- 索引操作 ----------------------------------------

  /**
   * 获取全部的索引
   */
  indices: () => Promise<IndexItemResult>;

  /**
   * 获取一个索引信息
   * @param index
   */
  getIndex: (index: string) => Promise<IndexItem>;

  /**
   * 创建一个索引结构
   */
  createIndex: (data: string) => Promise<void>;

  /**
   * 更新一个索引结构
   */
  updateIndex: (index: string, data: string) => Promise<void>;

  /**
   * 删除多个索引
   */
  deleteBatchIndex: (indexIds: Array<string>) => Promise<void>;

  /**
   * 为索引添加别名
   * @param index 索引名称
   * @param alias 别名名称
   */
  addAlias: (index: string, alias: string) => Promise<string>;

  /**
   * 删除索引别名
   * @param index 索引名称
   * @param alias 别名名称
   */
  removeAlias: (index: string, alias: string) => Promise<string>;

  // ---------------------------------------- 文档操作 ----------------------------------------

  /**
   * 插入一个文档
   *
   * @param index 文档所在索引
   * @param data 文档数据
   * @param type 对于低版本，需要传递类型，否则会报错
   */
  insertDoc: (index: string, data: string, type?: string) => Promise<string>;

  /**
   * 更新一个文档
   * @param index 文档所在索引
   * @param id 文档ID
   * @param data 文档数据
   * @param type 对于低版本，需要传递类型，否则会报错
   */
  updateDoc: (index: string, id: string, data: string, type?: string) => Promise<void>;

  /**
   * 删除多个索引
   * @param index 文档所在索引
   * @param docIds 文档ID
   * @param type 对于低版本，需要传递类型，否则会报错
   */
  deleteBatchDoc: (index: string, docIds: Array<string>, type?: string) => Promise<void>;

  // ---------------------------------------- 搜索操作 ----------------------------------------

  /**
   * 数据搜索
   *
   * @param props 参数
   * @returns 搜索结果
   */
  dataSearch: (props: DataSearchProp) => Promise<DataSearchResult>;

  /**
   * 基础搜索
   * @param prpps 参数
   * @returns 搜索结果
   */
  baseSearch: (props: BaseSearchProp) => Promise<BaseSearchResult>;

  /**
   * 高级搜索
   * @param props 查询语句
   * @returns 搜索结果
   */
  seniorSearch: (props: SeniorSearchProp) => Promise<string>;
}
